﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

using Sauces.Bussinees.Entities.Caja;
using Sauces.Bussinees.Entities.Almacen;
using Sauces.Bussinees.Logic.Service;
using Sauces.Bussinees.Logic.Caja.Service;
using Microsoft.Practices.Unity;
using System.Web.ModelBinding;


namespace Sauces.Web.Caja
{
    public partial class FrmFactura : System.Web.UI.Page
    {

        private const string KeyFactura = "factura";

        [Dependency]
        public  IClienteService clienteService { set; get; }

        [Dependency]
        public IProductoService productoService { set; get; }

        [Dependency]
        public IFacturaService facturaSevice { set; get; }

        protected void Page_Load(object sender, EventArgs e)
        {
            var opc = Request.QueryString["opc"];
            var IdFactura = Request.QueryString["id"];        
            

            if (!Page.IsPostBack)
            {
                if (opc != null && opc == "new")
                {
                    var nuevaFactura = new Factura()
                    {
                        
                        Fecha = DateTime.Now,
                        
                    };

                    BindingFactura(nuevaFactura);
                    ViewState["opc"] = opc;
                }

                else if (opc != null && opc == "detalle" && IdFactura != null)
                {
                    var factura = facturaSevice.getFromFacturaById(Int32.Parse(IdFactura.ToString()));

                    btnGuardar.Visible = false;
                    txtRuc.Enabled = false;
                    btnBuscarCliente.Visible = false;
                    lvProducto.Visible = false;
                    upProductos.Visible = false;
                    BindingFactura(factura);
                    ViewState["opc"] = opc;
                }
            }

        }

        private void BindingFactura(Factura nuevaFactura)
        {
            Cache.Insert(KeyFactura, nuevaFactura);

            txtId.Text = nuevaFactura.Id.ToString();
            txtFecha.Text = nuevaFactura.Fecha.ToShortDateString();
            

            if (nuevaFactura.Cliente != null)
            {
                txtRuc.Text = nuevaFactura.Cliente.Ruc.ToString();
                txtRazon.Text = nuevaFactura.Cliente.RazonSocial.ToString();
                txtDireccion.Text = nuevaFactura.Cliente.Direccion.ToString();
            }



            decimal igv = ((nuevaFactura.DetalleFactura.Sum(dp => dp.Monto) * 100) / 118);

            var igv2 = decimal.Round(igv, 2);

            nuevaFactura.SubTotal = ((nuevaFactura.DetalleFactura.Sum(dp => dp.Monto)) - igv2 );
            nuevaFactura.Igv = igv2;
            nuevaFactura.Total = nuevaFactura.DetalleFactura.Sum(dp => dp.Monto);


            Cache.Insert(KeyFactura, nuevaFactura);

            lvDetalleFactura.DataSource = nuevaFactura.DetalleFactura;
            lvDetalleFactura.DataBind();

            var lblTotal = lvDetalleFactura.FindControl("lblTotal") as Label;
            var lblSubTotal = lvDetalleFactura.FindControl("lblSubTotal") as Label;
            var lblIgv = lvDetalleFactura.FindControl("lvlIgv") as Label;

            if (lblTotal != null && lblSubTotal != null && lblIgv != null)
            {
                lblTotal.Text = nuevaFactura.Total.ToString();
                lblSubTotal.Text = nuevaFactura.SubTotal.ToString();
                lblIgv.Text = nuevaFactura.Igv.ToString();
            }
        }


        protected void btnBuscarCliente_Click1(object sender, EventArgs e)
        {
            var ruc = txtRuc.Text;

            var cliente = clienteService.getFromClienteByRuc(ruc);

            var factura = Cache.Get(KeyFactura) as Factura;

            if (cliente == null)
            {
                lblMsgCliente.Text = "El cliente no existe !!!";
                txtRuc.Text = "";
                txtRazon.Text = "";
                txtDireccion.Text = "";

                factura.Cliente = null;
            }
            else
            {
                factura.IdCliente = cliente.Id;
                factura.Cliente = cliente;

                Cache.Insert(KeyFactura, factura);

                txtRuc.Text = cliente.Ruc;
                txtRazon.Text = cliente.RazonSocial;
                txtDireccion.Text = cliente.Direccion;
                lblMsgCliente.Text = "";
            }

        }

        public IEnumerable<Producto> GetProductos([Control("txtNombre")]string criterio)
        {

            return productoService.getAllProductoByNombre(criterio);
        }       

        private Factura GetFactura()
        {
            return Cache.Get(KeyFactura) as Factura;
        }

        protected void lvProducto_ItemCommand(object sender, ListViewCommandEventArgs e)
        {
            if (e.CommandName == "AddDetalle")
            {
                var productoId = Int32.Parse(e.CommandArgument.ToString());
                
                var factura = Cache.Get(KeyFactura) as Factura;

                var existe = factura.DetalleFactura.Where(dp => dp.IdProducto == productoId).SingleOrDefault();
                if (existe != null)
                {
                    existe.Cantidad += 1;
                }

                else
                {
                    var producto = productoService.getFromProductoById(productoId);

                    var newDetalle = new DetalleFactura()
                    {
                        IdFactura = factura.Id,
                        IdProducto = producto.Id,
                        Producto = producto,
                        Precio = producto.PVenta,
                        Cantidad = 1
                        
                    };


                    factura.DetalleFactura.Add(newDetalle);
                }

                BindingFactura(factura);
            }
        }

        protected void lvDetalleFactura_ItemCommand(object sender, ListViewCommandEventArgs e)
        {
            if (e.CommandName == "QuitarDetalle")
            {
                var idProducto = Int32.Parse(e.CommandArgument.ToString());

                var factura = GetFactura();

                var detalle = factura.DetalleFactura.Where(dp => dp.IdProducto == idProducto).SingleOrDefault();

                if (detalle != null)
                    factura.DetalleFactura.Remove(detalle);

                BindingFactura(factura);
            }
            else if (e.CommandName == "ActualizarDetalle")
            {
                var factura = GetFactura();

                foreach (var row in lvDetalleFactura.Items)
                {
                    var txtCantidad = row.FindControl("txtCantidad") as TextBox;
                    var txtPrecio = row.FindControl("txtPrecio") as TextBox;

                    factura.DetalleFactura.ToList()[row.DisplayIndex].Cantidad = decimal.Parse(txtCantidad.Text);
                    factura.DetalleFactura.ToList()[row.DisplayIndex].Precio = decimal.Parse(txtPrecio.Text);
                }

                BindingFactura(factura);
            }
        }

        protected void btnGuardar_Click(object sender, EventArgs e)
        {
            var factura = GetFactura();
            factura.Fecha = DateTime.Parse(txtFecha.Text);      


            if (factura != null)
            {
                if (ViewState["opc"].ToString() == "new")
                {
                    facturaSevice.addFactura(factura);
                    Response.Redirect("FrmListaFatura.aspx");
                }

                else if (ViewState["opc"].ToString() == "editar")
                {
                    facturaSevice.upDateFactura(factura);
                    Response.Redirect("FrmListaFatura.aspx");
                }

            }
        }  
    }
}